[zs_id].vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777
  1. <template>
  2. <NavHeader/>
  3. <bread-crumb/>
  4. <div class="w-1200px m-auto">
  5. <div class="relative -mt-40px flex justify-end">
  6. <button type="button" class="back-btn" @click="linkTo('process')">返回</button>
  7. </div>
  8. <div class="mt-10px w-full min-h-860px bg-hex-FFF pt-25px pb-30px">
  9. <h3 class="text-18px text-center">附件出题</h3>
  10. <div class="mt-60px pl-250px">
  11. <el-form ref="ruleFormRef" :rules="rules" :model="createForm" label-width="140px" size="large" status-icon>
  12. <el-form-item label="学科" style="width: 620px">
  13. <h3 class="text-14px">{{ createForm.xkmc }}</h3>
  14. </el-form-item>
  15. <el-form-item label="答题卡名称" prop="dtkmc" style="width: 620px">
  16. <el-input v-model="createForm.dtkmc" placeholder="请输入答题卡名称"/>
  17. </el-form-item>
  18. <el-form-item label="答题卡别名" style="width: 620px">
  19. <el-input v-model="createForm.dtkbm" placeholder="请输入答题卡别名"/>
  20. </el-form-item>
  21. <el-form-item label="及格分数" prop="jgfs" style="width: 620px">
  22. <el-input v-model="createForm.jgfs" placeholder="请输入及格分数"/>
  23. </el-form-item>
  24. <el-form-item label="优秀分数" prop="yxfs" style="width: 620px">
  25. <el-input v-model="createForm.yxfs" placeholder="请输入优秀分数"/>
  26. </el-form-item>
  27. <el-form-item label="流程类型" prop="lclx" style="width: 620px">
  28. <el-radio-group v-model="createForm.lclx">
  29. <el-radio v-for="item in lc_type_list" :label="item.value">{{ item.label }}</el-radio>
  30. </el-radio-group>
  31. </el-form-item>
  32. <el-form-item label="阅卷流程" prop="fj_choose" style="width: 620px">
  33. <el-radio-group v-model="createForm.fj_choose">
  34. <el-radio v-for="item in yjlc" :label="item.value" @change="fileList = []">{{ item.label }}</el-radio>
  35. </el-radio-group>
  36. </el-form-item>
  37. <el-form-item>
  38. <el-upload v-if="createForm.fj_choose === '1'"
  39. action=""
  40. :auto-upload="false"
  41. :show-file-list="false"
  42. :on-change="uploadFile"
  43. v-loading.fullscreen.lock="fullscreenLoading"
  44. accept=".jpg,.png,.jpeg"
  45. class="upload-demo"
  46. >
  47. <el-button type="primary" color="#003eee">
  48. <el-icon :size="24">
  49. <UploadFilled/>
  50. </el-icon>
  51. <span>上传文件</span>
  52. </el-button>
  53. <template #tip>
  54. <div class="el-upload__tip">
  55. 上传文件格式支持 jpg,png,jpeg
  56. </div>
  57. </template>
  58. </el-upload>
  59. <div v-else-if="createForm.fj_choose === '2'">
  60. <el-button type="primary" color="#003eee" @click="launchClient">
  61. <el-icon :size="24">
  62. <Promotion/>
  63. </el-icon>
  64. <span>启动客户端</span>
  65. </el-button>
  66. </div>
  67. <div v-else>
  68. <el-button type="primary" color="#003eee" @click="chooseCard">
  69. <el-icon :size="24">
  70. <Plus/>
  71. </el-icon>
  72. <span>请选择答题卡</span>
  73. </el-button>
  74. </div>
  75. </el-form-item>
  76. <el-form-item v-if="fileList.length > 0" label="文件列表">
  77. <div class="flex">
  78. <div class="w-370px">名称</div>
  79. <div class="w-200px">操作</div>
  80. </div>
  81. <div class="flex" v-for="(item,index) in fileList">
  82. <div class="w-370px truncate">{{ item.name }}</div>
  83. <div class="w-200px">
  84. <el-link :underline="false" @click="filePreview(item)">预览</el-link>
  85. <el-link class="ml-10px" :underline="false" @click="downloadFile(item)">下载</el-link>
  86. <el-link class="ml-10px" :underline="false" @click="delFile(index)">删除</el-link>
  87. </div>
  88. </div>
  89. </el-form-item>
  90. <el-form-item>
  91. <div class="mt-50px pl-50px">
  92. <el-button class="mr-20px" @click="linkTo('process')"><span class="px-40px">取消</span></el-button>
  93. <el-button type="primary" color="#003eee" @click="handleSubmit(ruleFormRef)"><span
  94. class="px-40px">确定</span></el-button>
  95. </div>
  96. </el-form-item>
  97. </el-form>
  98. </div>
  99. </div>
  100. </div>
  101. <el-dialog v-model="previewDialogVisible" title="文件预览"
  102. width="850px"
  103. custom-class="dialogTrick"
  104. append-to-body>
  105. <div class="w-full h-700px overflow-auto">
  106. <img class="w-full" v-if="fileType === 'img'" :src="fileUrl" alt="Preview Image"/>
  107. <video class="w-full h-full" controls v-if="fileType === 'mp4'" :src="fileUrl"></video>
  108. <iframe class="w-full h-full" v-if="fileType === 'file'" :src="fileUrl" frameborder="0"></iframe>
  109. </div>
  110. </el-dialog>
  111. <el-dialog
  112. v-model="dialogVisible"
  113. title="答题卡选择"
  114. width="980px"
  115. custom-class="dialogTrick"
  116. append-to-body
  117. >
  118. <el-form :inline="true" class="flex justify-between" size="large">
  119. <el-form-item label="考试时间筛选">
  120. <el-date-picker
  121. v-model="exam_time"
  122. value-format="YYYY-MM-DD"
  123. type="daterange"
  124. range-separator="至"
  125. start-placeholder="开始时间"
  126. end-placeholder="结束时间"
  127. @change="handleDateChange"
  128. size="large"
  129. />
  130. </el-form-item>
  131. <div>
  132. <el-form-item style="margin-right: 10px">
  133. <el-input v-model="keyword" style="width: 200px;" placeholder="请输入关键字" clearable @keyup.enter="filterData"
  134. @clear="filterData"/>
  135. </el-form-item>
  136. <el-form-item>
  137. <el-button color="#003eee" type="primary" @click="filterData">搜索</el-button>
  138. </el-form-item>
  139. </div>
  140. </el-form>
  141. <div v-if="cardList.length > 0">
  142. <ul class="card-list py-15px pl-20px">
  143. <li v-for="item in cardList" class="relative py-15px" :class="chooseCheck === item.zs_id?'selected':''">
  144. <div class="choose">
  145. <p class="set-check">
  146. <input type="radio" :id="item.zs_id" :value="item.zs_id" v-model="chooseCheck">
  147. <label :for="item.zs_id"></label>
  148. </p>
  149. </div>
  150. <div class="w-162px h-108px m-auto overflow-hidden">
  151. <img class="w-full"
  152. :src="item.fj_content[0].url"
  153. alt="">
  154. </div>
  155. <h3 class="mt-10px mb-10px px-20px text-13px leading-20px truncate text-center">{{item.zs_name}}</h3>
  156. <button type="button" class="op-btn block m-auto" :disabled="item.not_allowed" @click="imgShow(item)">查看</button>
  157. </li>
  158. </ul>
  159. <div class="mt-20px page-new flex justify-end">
  160. <el-pagination v-model:current-page="cur_page" v-model:page-size="limit" layout="total,prev, pager, next" :total="total" :background="true" @current-change="handleSelectionChange"></el-pagination>
  161. </div>
  162. </div>
  163. <div v-else class="no-data">
  164. <div>
  165. <h3 class="no-data-img"></h3>
  166. <h4 class="mt-25px text-18px text-hex-0048e5 text-center">暂无数据</h4>
  167. </div>
  168. </div>
  169. <template #footer>
  170. <span class="dialog-footer">
  171. <el-button @click="dialogVisible = false" class="mr-15px" size="large">
  172. <span class="px-10px">取消</span>
  173. </el-button>
  174. <el-button size="large" color="#003eee" type="primary" :disabled="chooseCheck === ''" @click="chooseCardSub">
  175. <span class="px-10px">确定</span>
  176. </el-button>
  177. </span>
  178. </template>
  179. </el-dialog>
  180. <div class="loading-mask" v-if="scanLoading">
  181. <div class="text-center">
  182. <div class="loading-icon"></div>
  183. <h3 class="text-16px text-center text-hex-959595">客户端处理中,耐心等待……</h3>
  184. </div>
  185. </div>
  186. <div class="preview-box" v-if="showPreview">
  187. <el-icon class="preview-close cursor-pointer" @click="showPreview = false"><CloseBold /></el-icon>
  188. <el-carousel class="h-full overflow-y-auto" :autoplay="false" indicator-position="none">
  189. <el-carousel-item v-for="item in imgPreview" :key="item">
  190. <img class="m-auto block" :src="item.url" alt="">
  191. </el-carousel-item>
  192. </el-carousel>
  193. </div>
  194. <commonFooter/>
  195. </template>
  196. <route lang="json">
  197. {
  198. "meta":{
  199. "title":"附件出题",
  200. "breadcrumb": true
  201. }
  202. }
  203. </route>
  204. <script setup>
  205. import {useRouter} from "vue-router";
  206. import request from "~/utils/request";
  207. import {REQUEST} from "~/utils/request";
  208. import {user} from "~/store";
  209. const router = useRouter();
  210. const route = useRoute();
  211. const linkTo = (name) => {
  212. router.push({name});
  213. };
  214. const rules = $ref({
  215. dtkmc: [{required: true, message: '请输入答题卡名称', trigger: 'blur'}],
  216. jgfs: [{required: true, message: '请输入及格分数', trigger: 'blur'}],
  217. yxfs: [{required: true, message: '请输入优秀分数', trigger: 'blur'}],
  218. lclx: [{required: true, message: '请选择流程类型', trigger: 'change'}],
  219. fj_choose: [{required: true, message: '请选择阅卷流程', trigger: 'change'}],
  220. })
  221. const ruleFormRef = ref(null);
  222. let createForm = $ref({
  223. xkmc: '',
  224. dtkmc: '',
  225. dtkbm: '',
  226. jgfs: '',
  227. yxfs: '',
  228. lclx: '',
  229. fj_choose: '1'
  230. })
  231. let lc_type_list = [{
  232. value: '0',
  233. label: '常规'
  234. }, {
  235. value: '1',
  236. label: '自定义框选'
  237. }, {
  238. value: '2',
  239. label: '无定位点框选(第三方答题卡)'
  240. }]
  241. let yjlc = [{
  242. value: '1',
  243. label: '上传文件'
  244. }, {
  245. value: '2',
  246. label: '模板预扫描'
  247. }, {
  248. value: '3',
  249. label: '沿用答题卡'
  250. }]
  251. function handleAutoCompleteTask(val) {
  252. const { gid, pid, cid } = JSON.parse(sessionStorage.getItem('StepId'));
  253. // handleCompleteTask(gid, pid, cid)
  254. const _ykl_lc_ = JSON.parse(sessionStorage.getItem('ykl_lc'));
  255. _ykl_lc_.processList[gid][pid][cid] = val || 1;
  256. return request({
  257. url: '/yzy/kmksyjlc/save',
  258. data: {
  259. ykl_id: _ykl_lc_.ykl_id,
  260. yk: {
  261. ykl_lc: JSON.stringify(_ykl_lc_),
  262. },
  263. },
  264. }).then((res) => {
  265. if (res.code === '1') {
  266. ElMessage({
  267. message: '操作成功',
  268. type: 'success',
  269. grouping: true,
  270. });
  271. sessionStorage.setItem('ykl_lc', JSON.stringify(_ykl_lc_));
  272. nextTick(()=>{
  273. router.back();
  274. })
  275. }
  276. }).catch(() => {
  277. ElMessage({
  278. message: '操作失败',
  279. type: 'error',
  280. grouping: true,
  281. });
  282. });
  283. }
  284. const handleCancel = () => {
  285. router.back();
  286. }
  287. const handleSubmit = async (formEl) => {
  288. if (!formEl) return;
  289. formEl.validate(async (valid, fields) => {
  290. if (valid) {
  291. if (fileList.length === 0) {
  292. ElMessage({
  293. type: "warning",
  294. message: "请先上传附件!",
  295. });
  296. } else {
  297. request({
  298. url: '/yzy/ksjh/fjct_edit',
  299. data: {
  300. zs_id: zs_id,
  301. ze_id: ze_id,
  302. zs_name: createForm.dtkmc,
  303. zs_alias: createForm.dtkbm,
  304. zs_lctype: createForm.lclx,
  305. fj_choose: createForm.fj_choose,
  306. fj_content: fileList,
  307. ze_pass_score: createForm.jgfs,
  308. ze_max_score: createForm.yxfs
  309. }
  310. }).then(res => {
  311. if (res.code === '1') {
  312. ElMessage.success("附件出题编辑成功!");
  313. // 需要跳转到新流程页面
  314. handleAutoCompleteTask();
  315. }
  316. })
  317. }
  318. } else {
  319. console.log("error submit!", fields);
  320. }
  321. });
  322. }
  323. let dialogVisible = $ref(false)
  324. let chooseCheck = $ref('');
  325. let ze_id = $ref('');
  326. let zs_id = $ref('');
  327. if (route.params.ze_id) {
  328. ze_id = route.params.ze_id;
  329. zs_id = route.params.zs_id;
  330. getDetail();
  331. }
  332. let fullscreenLoading = $ref(false)
  333. let fileList = $ref([])
  334. let scanLoading = $ref(false)
  335. function getDetail() {
  336. request({
  337. url: "/yzy/ksjh/fjct_detail",
  338. data: {
  339. ze_id: ze_id,
  340. zs_id: zs_id
  341. },
  342. }).then((res) => {
  343. if (res.code === "1") {
  344. createForm.xkmc = res.data.one_info.ze_xueke_name;
  345. createForm.dtkmc = res.data.one_info.zs_name;
  346. createForm.dtkbm = res.data.one_info.zs_alias;
  347. createForm.jgfs = res.data.one_info.ze_pass_score;
  348. createForm.yxfs = res.data.one_info.ze_max_score;
  349. createForm.lclx = res.data.one_info.zs_lctype;
  350. if (res.data.one_info.fj_choose === '0') {
  351. createForm.fj_choose = '1';
  352. } else {
  353. createForm.fj_choose = res.data.one_info.fj_choose;
  354. }
  355. fileList = [];
  356. if (res.data.one_info.fj_content !== '') {
  357. let i_arr = res.data.one_info.fj_content.split('**');
  358. for (let i in i_arr) {
  359. let f_obj = {
  360. name: i_arr[i].split('##')[0],
  361. url: i_arr[i].split('##')[1]
  362. }
  363. fileList.push(f_obj);
  364. }
  365. }
  366. }
  367. });
  368. }
  369. const uploadFile = (file) => {
  370. // console.log(file, 87)
  371. fullscreenLoading = true;
  372. REQUEST.upload({
  373. url: '/upload/main/file',
  374. data: {
  375. filedata: file.raw,
  376. mod: 'upload',
  377. action: 'main',
  378. do: 'file',
  379. urltype: '1'
  380. }
  381. }).then(res => {
  382. fullscreenLoading = false;
  383. if (res.code === '1') {
  384. // console.log(res.data, 89)
  385. let file_info = {
  386. name: res.data.file_name,
  387. url: res.data.url
  388. }
  389. fileList.push(file_info);
  390. } else {
  391. ElMessage({
  392. type: "warning",
  393. message: "上传失败",
  394. });
  395. }
  396. })
  397. }
  398. let previewDialogVisible = $ref(false)
  399. let fileType = $ref('')
  400. let fileUrl = $ref('')
  401. const filePreview = (item) => {
  402. previewDialogVisible = true;
  403. if (/\.(jpg|png|jpeg)/.test(item.url)) {
  404. fileType = 'img';
  405. fileUrl = item.url;
  406. } else if (/\.mp4/.test(item.url)) {
  407. fileType = 'mp4';
  408. fileUrl = item.url;
  409. } else if (/\.(docx|doc|pdf|ppt|pptx|xls|xlsx)/.test(item.url)) {
  410. fileType = 'file';
  411. fileUrl = 'https://view.officeapps.live.com/op/view.aspx?src=' + item.url;
  412. }
  413. }
  414. const downloadFile = (item) => {
  415. window.open(item.url, '_blank')
  416. }
  417. const delFile = (index) => {
  418. fileList.splice(index, 1)
  419. }
  420. const launchClient = () => {
  421. scanLoading = true;
  422. let scan_batch = parseInt(new Date().getTime() / 1000) + randomString(5);
  423. let clientLink = 'bozeduyuejuan://' + user.value.token + ',0,' + window.GLOBAL_CONFIG.yzy + ',pre_scan,' + scan_batch;
  424. window.open(clientLink, '_blank');
  425. getScanStatus(scan_batch);
  426. }
  427. function randomString(e) {
  428. e = e || 32;
  429. var t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456789",
  430. a = t.length,
  431. n = "";
  432. for (let i = 0; i < e; i++) n += t.charAt(Math.floor(Math.random() * a));
  433. return n
  434. }
  435. let timer = null;
  436. function interval(func, wait) {
  437. let interv = () => {
  438. func.call(null);
  439. timer = setTimeout(interv, wait);
  440. };
  441. timer = setTimeout(interv, wait);
  442. }
  443. function getScanStatus(scan_batch) {
  444. request({
  445. url: "/yzy/kmksyjlc/pre_scan_get",
  446. data: {
  447. tag: scan_batch
  448. },
  449. }).then((res) => {
  450. if (res.code === "1") {
  451. if (res.data.files.length === 0) {
  452. interval(() => {
  453. if (timer) {
  454. clearTimeout(timer);
  455. timer = null;
  456. }
  457. getScanStatus(scan_batch)
  458. }, 10000);
  459. } else {
  460. scanLoading = false;
  461. if (timer) {
  462. clearTimeout(timer);
  463. timer = null;
  464. }
  465. fileList = [];
  466. for (let i = 0; i < res.data.files.length; i++) {
  467. let file_info = {
  468. name: '模板_' + (i + 1),
  469. url: window.GLOBAL_CONFIG.yzy + '/' + res.data.files[i]
  470. }
  471. fileList.push(file_info);
  472. }
  473. }
  474. }
  475. })
  476. }
  477. let limit = $ref(8)
  478. let total = $ref(0)
  479. let cur_page = $ref(1)
  480. let exam_time = $ref([])
  481. let keyword = $ref('')
  482. let cardList = $ref([]);
  483. const chooseCard = () => {
  484. getListData();
  485. chooseCheck = '';
  486. dialogVisible = true;
  487. }
  488. function getListData() {
  489. let data = {
  490. page: cur_page,
  491. limit: limit,
  492. keyword: keyword
  493. }
  494. if(exam_time && exam_time.length > 0) {
  495. data.date_start = exam_time[0];
  496. data.date_end = exam_time[1];
  497. } else {
  498. data.date_start = '';
  499. data.date_end = '';
  500. }
  501. request({
  502. url: "/yzy/ksjh/before_paper",
  503. data: data,
  504. }).then((res) => {
  505. if (res.code === '1') {
  506. cardList = res.data.page_data;
  507. total = Number(res.data.total_rows);
  508. cur_page = Number(res.data.page_now);
  509. for(let i in cardList) {
  510. for(let j in cardList[i].fj_content) {
  511. cardList[i].not_allowed = /\.(docx|doc|pdf|ppt|pptx|xls|xlsx|mp4)/.test(cardList[i].fj_content[j].url);
  512. }
  513. }
  514. }
  515. })
  516. }
  517. const handleDateChange = (val) => {
  518. if (val) {
  519. exam_time = [val[0], val[1]];
  520. } else {
  521. exam_time = [];
  522. }
  523. cur_page = 1;
  524. getListData();
  525. }
  526. const handleSelectionChange = (val) => {
  527. cur_page = val;
  528. getListData();
  529. };
  530. function filterData() {
  531. cur_page = 1;
  532. getListData();
  533. }
  534. function chooseCardSub() {
  535. for(let i in cardList) {
  536. if(cardList[i].zs_id === chooseCheck) {
  537. fileList = cardList[i].fj_content;
  538. }
  539. }
  540. dialogVisible = false;
  541. }
  542. let imgPreview = $ref([]);
  543. let showPreview = $ref(false)
  544. function imgShow(item) {
  545. imgPreview = item.fj_content;
  546. showPreview = true;
  547. }
  548. </script>
  549. <style lang="scss">
  550. .dialogTrick .el-dialog__footer {
  551. text-align: center;
  552. }
  553. </style>
  554. <style lang="scss" scoped>
  555. ::v-deep .el-radio__input.is-checked .el-radio__inner {
  556. border-color: #003eee;
  557. background: #003eee;
  558. }
  559. ::v-deep .el-radio__input.is-checked + .el-radio__label {
  560. color: #003eee;
  561. }
  562. ::v-deep .el-carousel__container{
  563. height: 100%;
  564. }
  565. .card-list {
  566. display: flex;
  567. flex-wrap: wrap;
  568. max-height: 515px;
  569. overflow-y: auto;
  570. li {
  571. width: 203px;
  572. background: #ffffff;
  573. border: 2px solid #cacaca;
  574. border-radius: 10px;
  575. margin-right: 30px;
  576. margin-bottom: 30px;
  577. &.selected {
  578. border-color: #003eee;
  579. }
  580. &:nth-child(4n) {
  581. margin-right: 0;
  582. }
  583. &:hover {
  584. .card-pop {
  585. display: flex;
  586. }
  587. }
  588. .card-title {
  589. width: 100%;
  590. font-size: 13px;
  591. line-height: 15px;
  592. }
  593. }
  594. .card-pop {
  595. position: absolute;
  596. left: 0;
  597. top: 0;
  598. width: 100%;
  599. height: 100%;
  600. border-radius: 10px;
  601. z-index: 30;
  602. background: rgba(0, 0, 0, .45);
  603. display: none;
  604. align-items: center;
  605. justify-content: center;
  606. }
  607. }
  608. .op-btn {
  609. width: 60px;
  610. height: 30px;
  611. background: #fff;
  612. border: 1px solid #003eee;
  613. border-radius: 2px;
  614. font-size: 14px;
  615. color: #003eee;
  616. text-align: center;
  617. &:disabled{
  618. background: #ccc;
  619. border-color: #ccc;
  620. color: #fff;
  621. pointer-events: none;
  622. }
  623. }
  624. .choose {
  625. position: absolute;
  626. left: -12px;
  627. top: -12px;
  628. z-index: 50;
  629. }
  630. .set-check {
  631. position: relative;
  632. z-index: 40;
  633. width: 25px;
  634. height: 25px;
  635. label {
  636. position: absolute;
  637. left: 0;
  638. width: 25px;
  639. height: 25px;
  640. cursor: pointer;
  641. background: #fff;
  642. border-radius: 4px;
  643. box-shadow: 0 0 4px rgba(0, 0, 0, 0.18);
  644. }
  645. input[type=radio] {
  646. width: 25px;
  647. height: 25px;
  648. opacity: 0;
  649. &:checked + label {
  650. background: #003eee;
  651. }
  652. &:checked + label:after {
  653. content: '';
  654. width: 16px;
  655. height: 10px;
  656. position: absolute;
  657. top: 5px;
  658. left: 4px;
  659. border: 3px solid #fff;
  660. border-top: none;
  661. border-right: none;
  662. -moz-transform: rotate(-45deg);
  663. -ms-transform: rotate(-45deg);
  664. -webkit-transform: rotate(-45deg);
  665. transform: rotate(-45deg);
  666. }
  667. }
  668. }
  669. .loading-mask {
  670. position: fixed;
  671. left: 0;
  672. top: 0;
  673. width: 100%;
  674. height: 100%;
  675. z-index: 1500;
  676. background: rgba(255, 255, 255, .6);
  677. display: flex;
  678. justify-content: center;
  679. align-items: center;
  680. }
  681. .loading-mask .loading-icon {
  682. margin: 0 auto 15px;
  683. width: 72px;
  684. height: 72px;
  685. background: url("/images/loading-new.gif") center no-repeat;
  686. }
  687. .no-data {
  688. width: 100%;
  689. height: 300px;
  690. display: flex;
  691. justify-content: center;
  692. align-items: center;
  693. .no-data-img {
  694. width: 233px;
  695. height: 199px;
  696. background: url("/images/no-data.png") center no-repeat;
  697. }
  698. }
  699. .preview-box{
  700. position: fixed;
  701. left: 0;
  702. top: 0;
  703. width: 100%;
  704. height: 100%;
  705. z-index: 2100;
  706. background: rgba(0,0,0,.5);
  707. .preview-close{
  708. position: absolute;
  709. right: 15px;
  710. top: 15px;
  711. font-size: 40px;
  712. color: #fff;
  713. z-index:2200 ;
  714. }
  715. .el-carousel__item{
  716. display: flex;
  717. align-items: center;
  718. justify-content: center;
  719. overflow-y: auto;
  720. }
  721. img{
  722. max-width: 80% !important;
  723. }
  724. }
  725. </style>